package ACwing.P2DataSturcture.DisjointSetUnion;

import java.io.*;

/**
 * @Date : 2023-03-13
 * @Description:836. 合并集合
 * 1.将两个集合合并
 * 2.询问两个元素是否在一个集合当中
 * 基本原理：每个集合用一棵树表示，树根 编号就是集合的编号，每个节点存储父节点
 * p[x]表示x的父节点
 * 问题1：如何判断树根if(p[x]==x)
 * 问题2：如何求x的集合编号：while(p[x]!=x)x=p[x]
 * 问题3：如何合并两个集合：
 *          1）px是x的集合编号， py是y的集合编号，合并：让p[x]=y,把x插入y
 *优化：1)搜索后所有节点全部指向根节点    （路径压缩）
 *     2） 按秩合并
 */
public class Combined {
    static int N=100010,n,m;
    static int[]p=new int[N];
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        String[] s = br.readLine().split(" ");
        n = Integer.parseInt(s[0]);
        m=Integer.parseInt(s[1]);
        for (int i = 0; i <=n ; i++) p[i]=i;
        while(m--!=0){
                char [] op;
               String[] split=br.readLine().split("\\s+");
                op=split[0].toCharArray();
                int a=Integer.parseInt(split[1]);
                int b=Integer.parseInt(split[2]);
                if(op[0]=='M') p[find(a)]=find(b);//把a插入b
                else{
                    if(find(a)==find(b) )  bw.write("Yes\n");
                    else bw.write("No\n");
                }

        }
        bw.flush();
        bw.close();
    }
    static int find(int x){  //返回x的祖宗节点+路径压缩
        if(p[x]!=x) p[x]=find(p[x]);
        return p[x];
    }

}
